%{
  #include <iostream>
  #include "starter.h"
  #include "parser.hpp"
%}

%option noyywrap nounput noinput batch debug

%{
  # define YY_USER_ACTION  loc.columns (yyleng);
%}

/* 正则表达式，下面这三个够用了 */
id [_a-zA-Z][_a-zA-Z0-9]*
int [0-9]+
blank [ \t\r]

%%
%{
  /* 开启了bison提供的location功能 */
  yy::location& loc = drv.m_loc;
  loc.step ();
%}
{blank}           loc.step();                           /* 跳过空白字符 */
\n+               loc.lines(yyleng); loc.step();        /* 处理换行符 */
"int"            { return yy::parser::make_INT(loc); }     /* 关键字 int */
"return"         { return yy::parser::make_RETURN(loc); }  /* 关键字 return */
"void"           { return yy::parser::make_VOID(loc); }    /* 关键字 void */
"main"           { return yy::parser::make_MAIN(loc); }    /* 关键字 main */
"while"          { return yy::parser::make_WHILE(loc); }   /* 关键字 while */
"if"             { return yy::parser::make_IF(loc); }      /* 关键字 if */
"else"           { return yy::parser::make_ELSE(loc); }    /* 关键字 else */
"continue"       { return yy::parser::make_CONTINUE(loc); }/* 关键字 continue */
"break"          { return yy::parser::make_BREAK(loc); }   /* 关键字 break */
"="               return yy::parser::make_ASSIGN(loc);  /* 赋值操作符 */
"&&"              return yy::parser::make_LAND(loc);    /* 逻辑与 */
"||"              return yy::parser::make_LOR(loc);     /* 逻辑或 */
"!"               return yy::parser::make_LNOT(loc);    /* 逻辑非 */
"+"               return yy::parser::make_PLUS(loc);    /* 加号 */
"-"               return yy::parser::make_MINUS(loc);   /* 减号 */
"*"               return yy::parser::make_TIMES(loc);   /* 乘号 */
"/"               return yy::parser::make_DIVIDE(loc);  /* 除号 */
"%"               return yy::parser::make_MOD(loc);     /* 取模 */
"<"               return yy::parser::make_LT(loc);      /* 小于 */
"<="              return yy::parser::make_LE(loc);      /* 小于等于 */
">"               return yy::parser::make_GT(loc);      /* 大于 */
">="              return yy::parser::make_GE(loc);      /* 大于等于 */
"=="              return yy::parser::make_EQ(loc);      /* 等于 */
"!="              return yy::parser::make_NE(loc);      /* 不等于 */
"&"               return yy::parser::make_BAND(loc);    /* 按位与 */
"|"               return yy::parser::make_BOR(loc);     /* 按位或 */
"^"               return yy::parser::make_BXOR(loc);    /* 按位异或 */
"~"               return yy::parser::make_BITNOT(loc);  /* 按位非 */
"("               return yy::parser::make_LPAREN(loc);  /* 左圆括号 */
")"               return yy::parser::make_RPAREN(loc);  /* 右圆括号 */
"{"               return yy::parser::make_LBRACE(loc);  /* 左大括号 */
"}"               return yy::parser::make_RBRACE(loc);  /* 右大括号 */
";"               return yy::parser::make_SEMICOLON(loc); /* 分号 */
","               return yy::parser::make_COMMA(loc);    /* 逗号 */
{id}              return yy::parser::make_IDENTIFIER(yytext, loc); /* 标识符 */
{int}             return yy::parser::make_INTEGER(std::stoi(yytext), loc); /* 整数 */
<<EOF>>           return yy::parser::make_END(loc);      /* 文件结束 */


 

%%

void Starter::s_begin()
{
  // 关闭flex的debug信息
  yy_flex_debug = 0;
  yyin = fopen(my_file.c_str(), "r");
}

void Starter::s_end()
{
  fclose(yyin);
}